作者:塞上秋雪_838 | 来源:互联网 | 2023-09-18 11:54
由前面的集合基础那篇博客中已经知道了collection类下有List和Set两个模块,此篇博客将List与Set中的一些关系和问题罗列一下,参照老师的笔记。
一、collection:
1、collection 和 collections 的区别:
- collection是上级接口,继承他的子类有List和Set;
- collections是集合的工具类,提供一系列静态方法对集合的搜索、查找、同步操作;
2、Enumeration 和 Iterator 接口的区别:
Iterator代替了Enumeration接口,Enumeration是个旧的迭代器;
三点区别:
- Iterator的方法名比Enumeration更科学;
- Iterator比Enumeration更安全,因为当一个集合被遍历时它会阻止其他线程对集合的修改;
- Iterator能够删除元素,而Enumeration不能删除元素;
二、List 部分:
1、list特点:
(1)有序(插入、删除的顺序一致)
(2)允许存储重复元素
(3)有索引(可以通过for循环遍历访问)
2、List下的ArrayList与LinkedList的区别和联系:
1.一方面(联系):
它们都有序、可重复、有索引
2.另一方面(区别):
ArrayList底层是通过可变数组实现的;LinkedList底层是通过双向链表实现的;
也因此可以分析ArrayList和LinkedList的源码:
- ArrayList底层维护了一个Object类型的数组elementData。
- 当创建对象的时候,如果不指定容量的话,默认初始化elementData数组的大小为0;如果指定容量的话,默认初始化elementData数组大小为capacity;
- 当添加元素时,先判断是否需要扩容,不需要直接插入;如果需要扩容,先扩容后添加:第一次添加需要扩容—10、其他次添加需要扩容的话—1.5倍扩容;
- LinkedList底层维护了两个节点Node类型的first和last变量(与链表无异),如果是第一次添加,LinkedList中的first和last都指向新对象;如果不是第一次添加,ArrayList中的last指向新对象。
注意:根据数组与链表的增删改查特点我们可联想到,ArrayList对于元素的随机访问速度比较快,但LinkedList则需要遍历链表来访问某个元素;但是对于增加和删除操作来说,ArrayList每增加或删除元素都需要挪动其他位置的元素,而LinkedList增加或删除只需要改变对应的前后指针即可。但也不是ArrayList的增删就一定比LinkedList慢的,深处种菱浅种稻,具体情况具体分析吧。*
3、List下的vector与ArrayList区别和联系:
1、一方面(联系):
都实现了List接口,他们都是有序的集合(存取),底层实现都是数组,有索引且允许元素重复出现。
2、另一方面(区别):
- 同步性:vector是同步的、ArrayList是非同步的。但是用的时候即使需要一个同步的大多选择构造一个同步的ArrayList,而不是选用vector实现;
- 扩容:vector扩容增长一倍,而ArrayList扩容增长0.5倍。
三、Set 部分
1、Set特点:
(1)无序
(2)不允许重复元素
(3)没有索引
2、HashSet 与 TreeSet 区别:
- 一方面(联系):它们是set的子类,都具有无序、无重复、无索引的特点;
- 另一方面(区别):
(1)Hashset接口是无序、不可重复的集合;而TreeSet是有序的;
(2)HashSet底层是Hash实现(数组+链表),线程不安全;而TreeSet底层是红黑树数据结构,默认就对元素排序了;
(3)底层:HashSet实现了Set接口,由于是Hash表,实际上采用一个HashMap的实例,所有元素存储在HashMap的Key上,而value有一个固定的值,HashSet不存储重复元素iu是重写Hashcode()和equals()方法;TreeSet底层是用TreeMap实现的,构造方法中会采用一个TreeMap实例存放元素,添加元素时先判断有无比较器,如果有就根据比较器规则进行比较,没有比较器的话,就根据元素本身特性进行添加。
3、Comparable 与 Comparator 的区别
1、Comparable强行对实现它的每个类的对象进行整体排序;这种排序称为自然排序,Compara To()被称为他的自然比较方法,只能在类中实现Compara To()一次,不能经常修改类的代码实现自己的排序;
2、Comparator强行对某个对象进行整体排序,可以将comparator传递给sort方法(Arrays.sort;Collections.sort),从而允许在排序上精准控制;